package com.renchunlin.camerademo;

import android.content.Intent;
import android.graphics.ImageFormat;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.hardware.Camera;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 实现SurfaceView需要实现SurfaceHolder.Callback方法
 */
public class CustomCamera extends AppCompatActivity implements SurfaceHolder.Callback {

    private Camera mCamera;
    private SurfaceView mPreview;
    private SurfaceHolder mHolder;

    //拍照完成对调
    private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            /**
             * byte[] data 保存着拍照之后所存储的整个照片的数据，完成图像效果数据
             */
            //把数据保存到指定的路径上去
            File tempFile = new File("/sdcard/temp.png");
            //写入文件
            try {
                FileOutputStream fileOutputStream = new FileOutputStream(tempFile);
                fileOutputStream.write(data);
                fileOutputStream.close();
                Intent intent = new Intent(CustomCamera.this, Result.class);
                intent.putExtra("picPath", /*tempFile.getAbsoluteFile()*/"/sdcard/temp.png");
                startActivity(intent);
                finish();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.custom);
        initView();
    }

    private void initView() {
        mPreview = findViewById(R.id.preview);
        mPreview.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /**
                 * 点击SurfaceView自动对焦
                 */
                //对焦结果不需要处理，不需要回调，传null
                mCamera.autoFocus(null);
            }
        });
        //获得SurfaceHolder对象
        mHolder = mPreview.getHolder();
        //把当前activity作为回调设置给mHolder
        mHolder.addCallback(this);
    }

    /**
     * 拍照功能
     *
     * @param view
     */
    public void capture(View view) {
        //设置camera参数
        Camera.Parameters parameters = mCamera.getParameters();
        //设置拍照格式 设置jpge格式
        parameters.setPictureFormat(ImageFormat.JPEG);
        //设置预览大小
        parameters.setPictureSize(800, 400);
        //设置对焦功能    自动对焦
        /*
         * 设置这个属性前提是手机支持自动对焦
         * */
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
        /**
         * 在获取到最清晰的焦距之后再进行拍照
         */
        mCamera.autoFocus(new Camera.AutoFocusCallback() {
            @Override
            public void onAutoFocus(boolean success, Camera camera) {
                /**
                 * boolean success 参数就是代表当前对焦是否已经完全准确
                 */

                //对焦准确的情况下调用拍照功能
                if (success) {
                    /**
                     * 前两个参数可以为空
                     * 第三个参数是一个回调 拍摄完成之后需要完成的一个操作
                     */
                    mCamera.takePicture(null, null, mPictureCallback);
                }
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mCamera == null) {
            mCamera = getCamera();
            //获得camera对象后显示实时预览图
            if (mHolder != null) {
                //开始将相机与SurfaceView进项绑定同时预览整个相机的显示效果
                setStartPreview(mCamera, mHolder);
            }
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        releaseCamera();
    }

    /**
     * 获取系统的Camera对象
     *
     * @return 初始化完毕的Camera对象
     */
    private Camera getCamera() {
        Camera camera;
        try {
            camera = Camera.open();
        } catch (Exception e) {
            camera = null;
            e.printStackTrace();
        }
        return camera;
    }

    /**
     * 获得camera对象后在SurfaceView中显示camera实时预览的图像
     * 开始预览相机内容
     */
    private void setStartPreview(Camera camera, SurfaceHolder holder) {

        try {
            //相机与SurfaceView绑定
            camera.setPreviewDisplay(holder);

            /**
             * 系统默认的Camera是横屏的，所以预览的图像也是横屏的
             */

            //使整个camera竖过来  camera的旋转角度设为90读
            camera.setDisplayOrientation(90);

            //开始在SurfaceView中预览
            camera.startPreview();


        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 释放相机所占用的资源
     */
    private void releaseCamera() {
        if (mCamera != null) {
            //将相机的回调制空
            mCamera.setPreviewCallback(null);
            //停止运行效果    取消相机与SurfaceView的关联操作
            mCamera.stopPreview();
            mCamera.release();
            mCamera = null;
        }
    }

    /**
     * SurfaceHolder.Callback 3个实现方法
     * 将三个实现方法与camera的实现方法进行绑定
     *
     * @param holder
     */
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        //开始camera与SurfaceView的绑定，并且开始整个相机的预览功能
        setStartPreview(mCamera, mHolder);
    }

    //重启整个功能
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        //sop整个camera   将相机先进行关闭
        mCamera.stopPreview();
        //重启预览功能
        setStartPreview(mCamera, mHolder);
    }

    //释放掉所有的资源
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        releaseCamera();
    }
}
